package com.ctf.soft.ms.service.impl;

import com.ctf.soft.ms.service.IBaseService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;

import java.util.List;

/**
 * @User 王新禄
 * @Date 2015/10/17
 * @Description
 */
public class BaseService<T> implements IBaseService<T> {
    @Autowired
    private Mapper<T> mapper;

    /**
     * 方法描述：新增所有，无论属性是否为null
     *
     * @param t 实体对象
     * @return
     * @author jiajl
     */
    public int insert(T t) {
        return mapper.insert(t);
    }

    /**
     * 方法描述：新增，属性为null则不保存
     *
     * @param t 实体对象
     * @return
     * @author jiajl
     */
    public int insertSelective(T t) {
        return mapper.insertSelective(t);
    }

    /**
     * 方法描述：更新所有，无论属性是否为null
     *
     * @param t 实体对象
     * @return
     * @author jiajl
     */
    public int updateByPrimaryKey(T t) {
        return mapper.updateByPrimaryKey(t);
    }

    /**
     * 方法描述：更新，属性为null则不更新
     *
     * @param t 实体对象
     * @return
     * @author jiajl
     */
    public int updateByPrimaryKeySelective(T t) {
        return mapper.updateByPrimaryKeySelective(t);
    }

    /**
     * 方法描述：删除，根据id删除
     *
     * @param id 主键
     * @return
     * @author jiajl
     */
    public int deleteByPrimaryKey(String id) {
        return mapper.deleteByPrimaryKey(id);
    }

    /**
     * 方法描述：删除，根据条件删除
     *
     * @param t 实体对象
     * @return
     * @author jiajl
     */
    public int deleteByEntity(T t) {
        return deleteByEntity(t);
    }

    /**
     * 方法描述：查询实体对象，根据id查找
     *
     * @param id 主键
     * @return 实体对象
     * @author jiajl
     */
    public T selectByPrimaryKey(String id) {
        return mapper.selectByPrimaryKey(id);
    }

    /**
     * 方法描述：查询实体对象，根据条件查找
     *
     * @param t 实体对象
     * @return 实体对象
     * @author jiajl
     */
    public T selectByEntity(T t) {
        return mapper.selectOne(t);
    }

    /**
     * 方法描述：查询实体集合
     *
     * @return 实体集合
     * @author jiajl
     */
    public List<T> selectByList() {
        return mapper.select(null);
    }

    /**
     * 方法描述：查询实体集合，根据条件查找
     *
     * @param t 实体对象
     * @return 实体集合
     * @author jiajl
     */
    public List<T> selectByList(T t) {
        return mapper.select(t);
    }

    /**
     * 方法描述：查询实体集合，根据条件查找多少条记录
     *
     * @param t     实体对象
     * @param limit 条数
     * @return 实体集合
     * @author jiajl
     */
    public List<T> selectByLimit(T t, int limit) {
        RowBounds rowBounds = new RowBounds(0, limit);
        return mapper.selectByRowBounds(t, rowBounds);
    }

    /**
     * 方法描述：包含pageinfo的分页查询
     *
     * @param t     实体对象
     * @param page  页码
     * @param limit 每页条数
     * @return 返回结果
     * @author jiajl
     */
    public PageInfo<T> queryPageList(T t, int page, int limit) {
        PageHelper.startPage(page, limit);
        List<T> rs = mapper.select(t);
        return new PageInfo(rs);
    }
}
